import type { InterceptorHooks, ExpandAxiosResponse } from './types'
/**
 * @description: 约定后端响应错误吗
 */
enum Code {
    SUCCESS = 1,
    UNLOGIN = 127,
    UNAUTH = -1,
}

export const transform: InterceptorHooks = {
    requestInterceptor(config) {
        // 请求头部处理，如添加 token
        return config
    },
    requestInterceptorCatch(err) {
        // 请求错误，这里可以用全局提示框进行提示
        return Promise.reject(err)
    },
    responseInterceptor(result) {
        // 因为 axios 返回不支持扩展自定义配置，需要自己断言一下
        const res = result as ExpandAxiosResponse
        if (res.status !== 200) return Promise.reject(res)
        const { code } = res.data
        // 响应错误码为127或-1时，跳转登陆页
        if (code !== Code.SUCCESS && code !== 0) {
            if (res.config.requestOptions?.globalErrorMessage) {
                // 这里全局提示错误
                console.log(res)
                //console.error(res.data.message)
            }
            return Promise.reject(res.data)
        }
        if (res.config.requestOptions?.globalSuccessMessage) {
            // 这里全局提示请求成功
            console.log(res.data.message)
        }
        // 请求返回值，建议将 返回值 进行解构
        return res.data.data
    },
    responseInterceptorCatch(err) {
        // 这里用来处理 http 常见错误，进行全局提示
        const mapErrorStatus = new Map([
            [400, '请求方式错误'],
            [401, '请重新登录'],
            [403, '拒绝访问'],
            [404, '请求地址有误'],
            [500, '服务器出错'],
        ])
        const message =
            mapErrorStatus.get(err.response.status) || '请求出错，请稍后再试'
        // 此处全局报错
        console.error(message)
        return Promise.reject(err.response)
    },
}
